Nahrazeni textu v binarnim souboru ?
Otázka od: Jiri Betunak
21. 4. 2004 7:34
Zdravim konference,
potreboval bych poradit viz %subj%
resim to takto ale je to opravdu ale opravdu pomale ,neynate nekdo
prosim rychlejsi spusob ?
Procedure FileReplaceString(Const FileName, SearchString, ReplaceString:
String);
Var
fs: TFileStream;
pos: Integer;
b: Byte;
Begin
Pos := 1;
fs := TFileStream.Create(FileName, fmOpenReadWrite Or fmShareDenyNone);
form1.ProgressBar1.Max:=fs.Size;
Try
fs.Position:=0;
While fs.Position < fs.Size Do
Begin
form1.ProgressBar1.Position:=fs.Position;
form1.Label6.Caption:=inttostr(fs.Position)+'/'+inttostr(fs.Size);
Application.ProcessMessages;
fs.Read(b, 1);
If b = ord(SearchString[Pos]) Then
Begin
Inc(Pos);
If Pos - 1 = Length(SearchString) Then
Begin
// Nasel
fs.Seek(-(Length(SearchString)), soFromCurrent);
fs.Write(ReplaceString[1], Length(ReplaceString));
Pos := 1;
End;
End
Else
Begin
Pos := 1;
End;
End;
Finally
fs.Free;
End;
End;
Predem diky za jakoukoliv pomoc
--
Best regards,
Jiri mailto:kindrik@centrum.cz
ICQ: 265297587
__________________________________________________________________
Odpovedá: Tyslic Jiri
21. 4. 2004 7:55
Rekl bych, ze Application.ProcessMessages bych nevolal urcite pri kazdem
pruchodu, ale treba kazdy 10pruchod (cim mene, tim lepe). Ale to asi nebude ta
hlavni brzda...
Jirka
> -----Original Message-----
> From: Jiri Betunak [mailto:kindrik@centrum.cz]
> Sent: Wednesday, April 21, 2004 8:34 AM
> To: delphi-l@clexpert.cz
> Subject: Nahrazeni textu v binarnim souboru ?
>
>
> Zdravim konference,
> potreboval bych poradit viz %subj%
> resim to takto ale je to opravdu ale opravdu pomale ,neynate
> nekdo prosim rychlejsi spusob ?
>
> Procedure FileReplaceString(Const FileName, SearchString,
> ReplaceString:
> String);
> Var
> fs: TFileStream;
> pos: Integer;
> b: Byte;
> Begin
> Pos := 1;
> fs := TFileStream.Create(FileName, fmOpenReadWrite Or
> fmShareDenyNone); form1.ProgressBar1.Max:=fs.Size;
> Try
> fs.Position:=0;
> While fs.Position < fs.Size Do
> Begin
> form1.ProgressBar1.Position:=fs.Position;
>
> form1.Label6.Caption:=inttostr(fs.Position)+'/'+inttostr(fs.Size);
> Application.ProcessMessages;
>
> fs.Read(b, 1);
> If b = ord(SearchString[Pos]) Then
> Begin
>
> Inc(Pos);
> If Pos - 1 = Length(SearchString) Then
> Begin
> // Nasel
> fs.Seek(-(Length(SearchString)), soFromCurrent);
> fs.Write(ReplaceString[1], Length(ReplaceString));
> Pos := 1;
> End;
> End
> Else
> Begin
> Pos := 1;
> End;
> End;
> Finally
> fs.Free;
> End;
> End;
Odpovedá: Jiri Betunak
21. 4. 2004 8:53
Hello jiri,
>Rekl bych, ze Application.ProcessMessages .........
> ale treba kazdy 10pruchod (cim mene, tim
>lepe). Ale to asi nebude ta hlavni brzda...
No brzda to je ale i kdyz ho nevolam tak to je stejne pomale
napr 600kb soubor to prochazi (na 1200 celer) zhruba 7minut !
--
Best regards,
Jiri mailto:kindrik@centrum.cz
Odpovedá: Tyslic Jiri
21. 4. 2004 8:51
Mozna placnu hloupost, ale
1. zkusit pri tak malem souboru nacist stream do pameti a vsechno delat v
pameti?
2. nenacitat ze soubory po jednom znaku, ale vzdy blok dat (omezeni I/O
operaci)
Jirka
> -----Original Message-----
> From: Jiri Betunak [mailto:kindrik@centrum.cz]
> Sent: Wednesday, April 21, 2004 9:13 AM
> To: delphi-l@clexpert.cz
> Subject: Re: Nahrazeni textu v binarnim souboru ?
>
>
> Hello jiri,
>
>
> >Rekl bych, ze Application.ProcessMessages .........
> > ale treba kazdy 10pruchod (cim mene, tim
> >lepe). Ale to asi nebude ta hlavni brzda...
>
> No brzda to je ale i kdyz ho nevolam tak to je stejne pomale
> napr 600kb soubor to prochazi (na 1200 celer) zhruba 7minut !
>
> --
> Best regards,
> Jiri mailto:kindrik@centrum.cz
>
>
>
>
>
Odpovedá: delphin@post.cz
21. 4. 2004 9:34
Melo by pomoct:
- nacist najednou cely soubor do pameti
- vyhledavat pomoci SearchBuf
Odpovedá: Jiri Betunak
21. 4. 2004 9:48
Hello delphin,
dpc> Melo by pomoct:
dpc> - nacist najednou cely soubor do pameti
dpc> - vyhledavat pomoci SearchBuf
jj to ja vim ale nevim jak to udelat nebyl by prikladek
--
Best regards,
Jiri mailto:kindrik@centrum.cz
Odpovedá: Dalibor Faltynek
21. 4. 2004 9:55
Ahoj,
nejsem sice zadny expert, ale zkusil bych nacist vzdycky blok dat do
dlooouheho stringu, na to aplikovat funkci pro praci s podretezci POS, DEL a
INSERT. Predpokladam, ze tyto fce budou v delfi optimalizovane na rychlost
vic, nez kdyz to budes delat pesky vlastnim kodem. Akorat musis pohlidat,
abys dalsi blok dat nacital od pozice - delka hledaneho stringu. A rekl
bych, ze muzes pouzit ke cteni a zapisu blokove operace pascalu, nebo
streamy, to je burt.
Zdravi Dalik.
----- Original Message -----
From: Jiri Betunak <kindrik@centrum.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, April 21, 2004 8:34 AM
Subject: Nahrazeni textu v binarnim souboru ?
> Zdravim konference,
> potreboval bych poradit viz %subj%
> resim to takto ale je to opravdu ale opravdu pomale ,neynate nekdo
> prosim rychlejsi spusob ?
>
> Procedure FileReplaceString(Const FileName, SearchString, ReplaceString:
> String);
> Var
> fs: TFileStream;
> pos: Integer;
> b: Byte;
> Begin
> Pos := 1;
> fs := TFileStream.Create(FileName, fmOpenReadWrite Or fmShareDenyNone);
> form1.ProgressBar1.Max:=fs.Size;
> Try
> fs.Position:=0;
> While fs.Position < fs.Size Do
> Begin
> form1.ProgressBar1.Position:=fs.Position;
> form1.Label6.Caption:=inttostr(fs.Position)+'/'+inttostr(fs.Size);
> Application.ProcessMessages;
>
> fs.Read(b, 1);
> If b = ord(SearchString[Pos]) Then
> Begin
>
> Inc(Pos);
> If Pos - 1 = Length(SearchString) Then
> Begin
> // Nasel
> fs.Seek(-(Length(SearchString)), soFromCurrent);
> fs.Write(ReplaceString[1], Length(ReplaceString));
> Pos := 1;
> End;
> End
> Else
> Begin
> Pos := 1;
> End;
> End;
> Finally
> fs.Free;
> End;
> End;
>
>
> Predem diky za jakoukoliv pomoc
>
> --
> Best regards,
> Jiri mailto:kindrik@centrum.cz
>
> ICQ: 265297587
>
> __________________________________________________________________
>
>
>
>